package util

type Set[valueType comparable] struct {
	mp map[valueType]struct{}
}

func NewSet[valueType comparable]() Set[valueType] {
	return Set[valueType]{
		mp: map[valueType]struct{}{},
	}
}

func (s *Set[valueType]) Insert(value valueType) (exists bool) {
	exists = s.Exists(value)
	s.mp[value] = struct{}{}
	return
}

func (s *Set[valueType]) Delete(value valueType) (exists bool) {
	exists = s.Exists(value)
	delete(s.mp, value)
	return
}

func (s *Set[valueType]) Exists(value valueType) (exists bool) {
	_, exists = s.mp[value]
	return
}

func (s *Set[valueType]) Size() (size int) {
	return len(s.mp)
}

func (s *Set[valueType]) IsEmpty() (isEmpty bool) {
	return s.Size() == 0
}

func (s *Set[valueType]) GetAll() (list []valueType) {
	list = make([]valueType, 0, len(s.mp))
	for value := range s.mp {
		list = append(list, value)
	}
	return
}
